package xyz.lwm.lazycat.transaction.execute;

/**
 * 事务传播行为
 */
public enum Propagation {

    /**
     * 若存在当前事务，则加入当前事务，若不存在当前事务，则创建新的事务
     */
    REQUIRED(0),

    /**
     * 若存在当前事务，则加入当前事务，若不存在当前事务，则以非事务的方式运行
     */
    SUPPORTS(1),

    /**
     * 若存在当前事务，则加入当前事务，若不存在当前事务，则抛出异常
     */
    MANDATORY(2),

    /**
     * 始终以新事务的方式运行，若存在当前事务，则暂停（挂起）当前事务
     */
    REQUIRES_NEW(3),

    /**
     * 以非事务的方式运行，若存在当前事务，则暂停（挂起）当前事务
     */
    NOT_SUPPORTED(4),

    /**
     * 以非事务的方式运行，若存在当前事务，则抛出异常
     */
    NEVER(5),

    /**
     * 如果存在当前事务，则在嵌套事务中执行, 否则同 REQUIRED, 创建新事务
     * 嵌套事务异常时，将回滚嵌套事务，并继续外层事务；
     * 外层事务异常时，将回滚当前及所有嵌套事务
     */
    NESTED(6);

    public final int value;

    Propagation(int value) {
        this.value = value;
    }

}